package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"

	"github.com/fatih/color"
)

// Command 结构体用于存储命令信息
type Command struct {
	Section     string
	Content     string
	Description string
}

func main() {
	// 检查命令行参数
	if len(os.Args) < 2 {
		showUsage()
		os.Exit(1)
	}

	// 解析搜索模式和关键词
	var isAndMode bool
	var startIndex int

	if os.Args[1] == "-and" {
		isAndMode = true
		startIndex = 2
	} else if os.Args[1] == "-or" {
		isAndMode = false
		startIndex = 2
	} else {
		isAndMode = false
		startIndex = 1
	}

	// 检查是否有搜索关键词
	if len(os.Args) <= startIndex {
		showUsage()
		os.Exit(1)
	}

	// 获取所有搜索关键词
	keywords := make([]string, 0)
	for _, arg := range os.Args[startIndex:] {
		keywords = append(keywords, strings.ToLower(arg))
	}

	// 读取并解析命令
	commands := readCommands("commands.txt", keywords, isAndMode)
	if len(commands) == 0 {
		color.Yellow("没有找到匹配的命令")
		showUsage()
		os.Exit(0)
	}

	// 显示搜索模式
	if isAndMode {
		color.Blue("\n使用 AND 模式搜索（包含所有关键词）：%s", strings.Join(keywords, " 和 "))
	} else {
		color.Blue("\n使用 OR 模式搜索（包含任意关键词）：%s", strings.Join(keywords, " 或 "))
	}

	// 显示所有匹配的命令
	fmt.Println(strings.Repeat("-", 80))

	for i, cmd := range commands {
		// 显示章节（如果有）
		if cmd.Section != "" {
			color.Blue(cmd.Section)
		}

		// 显示命令内容并保留原始格式
		color.Green(cmd.Content)

		// 显示描述（如果有）
		if cmd.Description != "" {
			color.Yellow("说明: %s", cmd.Description)
		}

		// 如果不是最后一个命令块，添加分隔线
		if i < len(commands)-1 {
			fmt.Println(strings.Repeat("-", 80))
		}
	}
}

// 显示使用说明
func showUsage() {
	color.Blue("\n命令使用说明:")
	fmt.Println("go run search_cmd.go [-and|-or] [关键词1] [关键词2] ...")

	color.Blue("\n搜索模式:")
	fmt.Println("  -and    所有关键词都要匹配（命令或说明中）")
	fmt.Println("  -or     匹配任意关键词（命令或说明中）")
	fmt.Println("  (无参数) 默认使用单关键词搜索")

	color.Blue("\n使用示例:")
	color.Green("1. AND 模式搜索（同时包含所有关键词）:")
	fmt.Println("   go run search_cmd.go -and kubectl 删除")

	color.Green("2. OR 模式搜索（包含任意关键词）:")
	fmt.Println("   go run search_cmd.go -or pod 删除")

	color.Green("3. 默认模式（单个关键词）:")
	fmt.Println("   go run search_cmd.go kubectl")
}

func readCommands(filename string, keywords []string, isAndMode bool) []Command {
	file, err := os.Open(filename)
	if err != nil {
		color.Red("Error opening file: %v", err)
		os.Exit(1)
	}
	defer file.Close()

	var commands []Command
	var currentCommand Command

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()

		// 处理章节标题
		if strings.HasPrefix(line, "###") {
			if currentCommand.Content != "" {
				if matchKeywords(currentCommand, keywords, isAndMode) {
					commands = append(commands, currentCommand)
				}
				currentCommand = Command{}
			}
			currentCommand.Section = line
			continue
		}

		// 跳过空行或分隔线
		if strings.TrimSpace(line) == "" || strings.HasPrefix(line, "##") {
			if currentCommand.Content != "" && matchKeywords(currentCommand, keywords, isAndMode) {
				commands = append(commands, currentCommand)
				currentCommand = Command{}
			}
			continue
		}

		// 处理命令行
		if currentCommand.Content == "" {
			currentCommand.Content = line
		} else {
			currentCommand.Content += "\n" + line
		}

		// 判断多行命令结束
		if !strings.HasSuffix(strings.TrimSpace(line), "\\") {
			if matchKeywords(currentCommand, keywords, isAndMode) {
				commands = append(commands, currentCommand)
			}
			currentCommand = Command{}
		}
	}

	// 添加最后一个命令块
	if currentCommand.Content != "" && matchKeywords(currentCommand, keywords, isAndMode) {
		commands = append(commands, currentCommand)
	}

	return commands
}

func matchKeywords(command Command, keywords []string, isAndMode bool) bool {
	// 将命令内容和说明合并为一个字符串进行搜索
	text := strings.ToLower(command.Content + " " + command.Description)

	if isAndMode {
		// AND 模式：必须包含所有关键词
		for _, keyword := range keywords {
			if !strings.Contains(text, keyword) {
				return false
			}
		}
		return true
	} else {
		// OR 模式：包含任意关键词
		for _, keyword := range keywords {
			if strings.Contains(text, keyword) {
				return true
			}
		}
		return len(keywords) == 0
	}
}
